/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tesis.controller;


import java.io.IOException;
import java.security.Principal;
import java.util.*;
import java.util.logging.Level;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.map.JsonMappingException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import tesis.dto.in.*;
import tesis.dto.out.FormDTO;
import tesis.dto.util.Constantes;
import tesis.service.*;
import tesis.utils.JSONUtil;

/**
 *
 * @author hectdx
 */
@Controller(value="apClienteController")
@RequestMapping(value="/apCliente")
public class AplicacionClienteController {
    
    private final static Logger LOG=LoggerFactory.getLogger(AplicacionClienteController.class);

    
    @Inject
    private AplicacionClienteService aplicacionClienteService;
    @Inject
    private UsuarioService usuarioService;
    private Integer idUsuario = null;
    
    @RequestMapping(method= RequestMethod.GET)
    public String init(Model model,Principal principal,HttpServletRequest request,  
                        @RequestParam(required=false) Integer idProceso,
                        @RequestParam(required=false) Integer inicio,
                        @RequestParam(required=false) Integer ultimo) {  
        
        List<EstadoInstanciaEstacionDTO> lstEstadoInstanciaEstacion = aplicacionClienteService.getEstadoInstanciaEstacion();
        List<ProcesoDTO> lstProcesoDTO = new ArrayList<ProcesoDTO>();
        EstadoInstanciaEstacionDTO estado = new EstadoInstanciaEstacionDTO();
        AplicacionClienteDTO apClienteDTO = new AplicacionClienteDTO();  
                
        LOG.info("Iniciando bandeja cliente");
        
        apClienteDTO.setInicio(inicio);
        apClienteDTO.setUltimo(ultimo);
        
        idUsuario=usuarioService.getUserIdByName(principal.getName());
        request.getSession().setAttribute("idUsuario", idUsuario);
                
        List<InstanciaEstacionDTO> lstInstanciaEstacionDTO = new ArrayList<InstanciaEstacionDTO>();//aplicacionClienteService.getInstanciEstacionByUsuario(apClienteDTO).getLstInstanciaEstacionDTO();
        
        model.addAttribute("lstProcesoDTO", lstProcesoDTO);
        model.addAttribute("apClienteDTO", apClienteDTO);
        model.addAttribute("lstEstadoInstanciaEstacion",lstEstadoInstanciaEstacion);
        model.addAttribute("lstInstanciaEstacionDTO",lstInstanciaEstacionDTO);
        
         return "apCliente/apCliente";
    }
    
    @RequestMapping(value="/find",method= RequestMethod.GET)
    @ResponseBody
    public Map findInstanciaEstaciones(HttpServletRequest request, AplicacionClienteDTO apClienteDTO){
        Map map=new HashMap();    
        Integer idUsuario=null;
        EstadoInstanciaEstacionDTO estado = new EstadoInstanciaEstacionDTO();
        
        LOG.info("Procesando GET para  /find");
        idUsuario=(Integer)request.getSession().getAttribute("idUsuario");
        apClienteDTO.setIdUsuarioDTO(idUsuario);
        
        if (apClienteDTO.getNombreEstadoEstacion() == null || apClienteDTO.getNombreEstadoEstacion().equals("")) {
            List<EstadoInstanciaEstacionDTO> lstEstadoInstanciaEstacion = aplicacionClienteService.getEstadoInstanciaEstacion();

            for (EstadoInstanciaEstacionDTO e : lstEstadoInstanciaEstacion) {
                if (e.getNombre().equals(Constantes.Instancia_Estacion_INICIADA)) {
                    estado = e;
                    break;
                }
            }
            apClienteDTO.setNombreEstadoEstacion(estado.getDescripcion().toUpperCase());    
        }
        apClienteDTO.setNombreEstadoEstacion(apClienteDTO.getNombreEstadoEstacion().toUpperCase());
        
        ListInstanciaEstacionDTO instanciaEstacionResultsDTO = aplicacionClienteService.getInstanciEstacionByUsuario(apClienteDTO);
        
        map.put("lstInstanciaEstacionDTO", instanciaEstacionResultsDTO.getLstInstanciaEstacionDTO());
        map.put("totalRecords", instanciaEstacionResultsDTO.getCantidadTotal());
        map.put("startIndex", apClienteDTO.getInicio());
        return map;
    }
    
    
    @RequestMapping(value="/findProcesos",method= RequestMethod.GET)
    @ResponseBody
    public Map findProcesos(HttpServletRequest request, 
                                AplicacionClienteDTO apClienteDTO){
        Map map=new HashMap();    
        ListProcesoDTO resultProcesoDTO = null;
        Integer idUsuario=null;
        
        LOG.info("Procesando GET para  /findProcesos");
        
        idUsuario=(Integer)request.getSession().getAttribute("idUsuario");
        apClienteDTO.setIdUsuarioDTO(idUsuario);
        resultProcesoDTO = aplicacionClienteService.getProcesosDTOByUser(apClienteDTO);
                
        map.put("lstProcesoDTO", resultProcesoDTO.getLstProceso());
        map.put("totalRecords", resultProcesoDTO.getCantidadTotal());
        map.put("startIndex", apClienteDTO.getInicio());
        return map;
    }
    
    @RequestMapping(value="/openUserForm",method= RequestMethod.GET)
    public String openUserForm( Model model, Integer idinstanciaestacion){
        
     
        LOG.info("Procesando peticion GET para /openUserForm");
        InstanciaEstacionDTO instanciaEstacionDTO = aplicacionClienteService.getInstanciaEstacion(idinstanciaestacion);
       
        model.addAttribute("idinstanciaestacion",idinstanciaestacion);
        model.addAttribute("url",instanciaEstacionDTO.getUrl());
        model.addAttribute("nombreEstacion",instanciaEstacionDTO.getNombreEstacion());
        model.addAttribute("instanciaDTO",instanciaEstacionDTO);
        model.addAttribute("idproceso",instanciaEstacionDTO.getInstanciaProceso().getIdproceso());
   
        return "apCliente/userForm";
    }
    
    @RequestMapping(value="/openFirstUserForm",method= RequestMethod.GET)
    public String openFirstUserForm(Model model, Integer idProceso){
        
        InstanciaEstacionDTO instanciaEstacionDTO = aplicacionClienteService.getPrimeraEstacion(idProceso); //se obtiene el servicio por proceso
        model.addAttribute("nombreEstacion",instanciaEstacionDTO.getNombreEstacion());
        model.addAttribute("url",instanciaEstacionDTO.getUrl());
        model.addAttribute("idproceso",idProceso);
        model.addAttribute("idUsuario",idUsuario);
        
        return "apCliente/userForm";    
    }
    

//    
//    @RequestMapping(value="saveTemp",method= RequestMethod.POST)
//    @ResponseBody
//    public Map saveTemp(HttpServletRequest request, @RequestBody ProcesoDTO procesoDTO){
//        Map map=new HashMap();
//        String strJSON=null;
//            MapaSincronizado mapaSync=new MapaSincronizado();
//        LOG.info("Enviando temporal de proceso");
//        try {
//            strJSON=JSONUtil.convertObjectToJSON(procesoDTO);
//            mapaSync.setId(procesoDTO.getIdTemp());
//            mapaSync.setFecha(GregorianCalendar.getInstance().getTime());
//            mapaSync.setStringData(strJSON);
//            mapaSync.setNombre(procesoDTO.getNombre());
//            mapaSync.setEstado(procesoDTO.getEstado());
//            mapaSync.setLienzo(procesoDTO.getLienzo());
//            
//            mapaSync=syncService.sincronizarTemp(mapaSync);
//            
//        } catch (JsonGenerationException ex) {
//            java.util.logging.Logger.getLogger(ModeladorController.class.getName()).log(Level.SEVERE, null, ex);
//        } catch (JsonMappingException ex) {
//            java.util.logging.Logger.getLogger(ModeladorController.class.getName()).log(Level.SEVERE, null, ex);
//        } catch (IOException ex) {
//            java.util.logging.Logger.getLogger(ModeladorController.class.getName()).log(Level.SEVERE, null, ex);
//        }
//        map.put("error", false);
//        map.put("id", mapaSync.getId());
//        map.put("nombreProceso", mapaSync.getNombre());
//        map.put("estado", mapaSync.getEstado());
//        return map;
//    }
//    
//     
//    @RequestMapping(value="/findTemp",method= RequestMethod.GET)
//    @ResponseBody
//    public MapaSincronizadoDTO findMapaSincronizado(Model model, @RequestParam Integer id){
//          LOG.info("Procesando GET  para /findTemp");
//          return syncService.findById(id);
//    }
//        
//        @RequestMapping(value="/crearVariable",method= RequestMethod.GET)
//         public String crearVariable(Model model, @RequestParam(required=false) Integer idvariable){
//        
//        List<TipoDatoDTO> lstTipoDatoDTO = null;    
//            
//        
//        VariableDTO variableDTO=new VariableDTO();
//        LOG.info("Procesando GET  para /crear");
//        
//        lstTipoDatoDTO = tipoDatoService.find(new TipoDatoDTO());
//        if (idvariable == null){
//           variableDTO.setIdvariable(GregorianCalendar.getInstance().hashCode());
//        }
//        
//        model.addAttribute("lstTipoDatoDTO",lstTipoDatoDTO);
//        model.addAttribute("variableDTO", variableDTO);
//        return "modelador/variable";
//    }
//    
//        @RequestMapping(value="/crearTipoDocumento",method= RequestMethod.GET)
//        public String crearTipoDocumento(Model model,  TipoDocumentoDTO tipoDocumentoDTO){
//
//      
//                EstadoDocumentoDTO estadoDocumentoDTO = new EstadoDocumentoDTO();
//            estadoDocumentoDTO.setDescripcion("Descripcion");
//            estadoDocumentoDTO.setNombre("Nombre");
//        
//            if(tipoDocumentoDTO.getIdTipoDocumento() == null ){
//                tipoDocumentoDTO = new TipoDocumentoDTO();
//                tipoDocumentoDTO.setIdTipoDocumento(GregorianCalendar.getInstance().hashCode());
//            }
//            
//            
//            LOG.info("Procesando GET  para /crear");
//            model.addAttribute("tipoDocumentoDTO", tipoDocumentoDTO);
//            model.addAttribute("estadoDocumentoDTO", estadoDocumentoDTO);
//            return "modelador/tipoDocumento";
//    }
//    
//    @RequestMapping(value="/crearRegla",method= RequestMethod.GET)
//    public String crearRegla(Model model){
//        ReglaDTO reglaDTO=new ReglaDTO();
//        String reglaJSON=null;
//         LOG.info("Procesando GET  para /crearRegla");
//        try {
//            reglaJSON=JSONUtil.convertObjectToJSON(reglaDTO);
//        } catch (JsonGenerationException ex) {
//            java.util.logging.Logger.getLogger(ModeladorController.class.getName()).log(Level.SEVERE, null, ex);
//        } catch (JsonMappingException ex) {
//            java.util.logging.Logger.getLogger(ModeladorController.class.getName()).log(Level.SEVERE, null, ex);
//        } catch (IOException ex) {
//            java.util.logging.Logger.getLogger(ModeladorController.class.getName()).log(Level.SEVERE, null, ex);
//        }
//        
//         model.addAttribute("variableDTO", new ParametroVariableDTO());
//         model.addAttribute("reglaJSON",reglaJSON);
//        return "reglas/regla";
//    }
//    
//    
//    @RequestMapping(value="instalarProceso",method= RequestMethod.POST)
//    @ResponseBody
//    public Map instalarProceso (HttpServletRequest request, @RequestBody ProcesoDTO procesoDTO){
//        Map map=new HashMap();
//       
//        LOG.info("procesando POST para /instalarProceso");
//        
//            //retiramos el lienzo
//            procesoDTO.setLienzo(null);
//            procesoDTO.setIdProceso(null);
//            procesoDTO.setIdCategoriaProceso(3);//en BD
//            procesoDTO=procesoService.instalarProceso(procesoDTO);
//            if (procesoDTO.isError()){
//                map.put("error", true);
//                LOG.error("Ocurrio un error: "+procesoDTO.getMensaje());
//            }else{
//                LOG.info("Proceso instalado correctamente, id: "+procesoDTO.getIdProceso());    
//            }
//
//        return map;
//    }
//    
//    @RequestMapping(value="/eliminarModelado",method= RequestMethod.GET)
//    @ResponseBody
//    public Map eliminarModelado(Model model, @RequestParam Integer id){
//          LOG.info("Procesando GET  para /eliminarModelado");
//          return syncService.eliminarMapa(id);
//    }
//    
    /*public void crearLstConexiones(ProcesoDTO procesoDTO){
        
        List<ConexionDTO> lstConexionDTO = procesoDTO.getLstConexiones();
        for(ConexionDTO conexionDTO : lstConexionDTO){
            int id = GregorianCalendar.getInstance().hashCode();   
            conexionDTO.setIdConexion(id);
            Conexion conexion = ConvertBeanUtil.convertConexionDTOtoEntity(conexionDTO, procesoDTO.getLstEstaciones());
            conexionService.instalarConexion(conexion);
        }
        
    }
        
    public void crearLstVariables(ProcesoDTO procesoDTO, Proceso proceso){
       
        List<VariableDTO> lstVariablesDTO = procesoDTO.getLstVariables();
        
        for (VariableDTO variableDTO : lstVariablesDTO) {
            int id = GregorianCalendar.getInstance().hashCode();           
            variableDTO.setIdvariable(id);     
            variableDTO.setTipoDatoDTO(tipoDatoService.findByName(variableDTO.getTipoDatoDTO().getNombretipodato()));
            Variable variable = ConvertBeanUtil.convertVariableDTOtoEntity(variableDTO);
            variable.setIdproceso(proceso);
            variableService.intalarVariable(variable);
        }
       
    }
    
       
    public void crearLstTipoDocumentos(ProcesoDTO procesoDTO,Proceso proceso){
        List<TipoDocumentoDTO> lstTipoDocumentoDTO = procesoDTO.getLstDocumentos();
        
        for (TipoDocumentoDTO tipoDocumentoDTO : lstTipoDocumentoDTO) {
            int id = GregorianCalendar.getInstance().hashCode();           
            tipoDocumentoDTO.setIdTipoDocumento(id);
            TipoDocumento tipoDocumento = ConvertBeanUtil.convertTipoDocumentoDTOtoEntity(tipoDocumentoDTO);
            tipoDocumento.setIdproceso(proceso);
            
            tipoDocumentoService.instalarTipoDocumento(tipoDocumento);
            
            crearLstEstadoDocumento(tipoDocumentoDTO.getLstEstadoDocumentoDTO(),tipoDocumento);
            
        
        }
 
    }
    
    
    public void crearLstEstadoDocumento(List<EstadoDocumentoDTO> lstDocumentosDTO,TipoDocumento tipoDocumento){
        for(EstadoDocumentoDTO estadoDTO : lstDocumentosDTO){
            int id = GregorianCalendar.getInstance().hashCode();  
            estadoDTO.setIdestadodocumento(id);
            EstadoDocumento estadoDocumento =  ConvertBeanUtil.convertEstadoDocumentoDTOtoEntity(estadoDTO);
            estadoDocumento.setIdtipodocumento(tipoDocumento);                
            estadoDocumentoService.instalarEstadoDocumento(estadoDocumento);
        }
       
    }
    
    public void crearLstEstaciones(ProcesoDTO procesoDTO, Proceso proceso){

        List<EstacionDTO> lstEstacionesDTO = procesoDTO.getLstEstaciones();
        for(EstacionDTO estacionDTO: lstEstacionesDTO){
            int id = GregorianCalendar.getInstance().hashCode();
            estacionDTO.setIdEstacion(id);
            Estacion estacion = ConvertBeanUtil.convertEstacionDTOtoEntity(estacionDTO);
            estacion.setIdproceso(proceso);
            estacionService.instalarEstacion(estacion);
                
        }

    }
   
    
    */
    
    @RequestMapping(value="/mostrarMapa",method= RequestMethod.GET)
    public String mostrarMapa(Model model,  @RequestParam(required=false)Integer idProceso, 
                                            @RequestParam(required=false)Integer idInstancia,
                                            @RequestParam(required=false)Integer idMapa,
                                            @RequestParam(required=false) String nombreEstacion){
        
        /*InstanciaProcesoDTO procesoDTO=null;;
       //traer la instancia 
        procesoDTO=aplicacionClienteService.getInstanciaProceso(idProceso);
        */
        FormDTO mapaValores=aplicacionClienteService.getMapaValores(idProceso);
        String mapaValoresString=null;
        
        try {
            mapaValoresString=JSONUtil.convertObjectToJSON(mapaValores);
        } catch (JsonGenerationException ex) {
            java.util.logging.Logger.getLogger(AplicacionClienteController.class.getName()).log(Level.SEVERE, null, ex);
        } catch (JsonMappingException ex) {
            java.util.logging.Logger.getLogger(AplicacionClienteController.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            java.util.logging.Logger.getLogger(AplicacionClienteController.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        model.addAttribute("mapaValores", mapaValoresString);
        model.addAttribute("idMapa",idMapa);
        model.addAttribute("idInstancia",idInstancia);
        model.addAttribute("idProceso",idMapa);
        model.addAttribute("nombreEstacion",nombreEstacion);
        
        
        return "apCliente/mostrarModelo";    
    }
    
    
     
    @RequestMapping(value="/findTemp",method= RequestMethod.GET)
    @ResponseBody
    public MapaSincronizadoDTO findMapaSincronizado(Model model, @RequestParam Integer id){
           
          LOG.info("Procesando GET  para findTemp");
          return aplicacionClienteService.findMapaById(id);
    }

}
